// 版权声明，Epic Games 公司保留所有权利

#include "LyraInventoryItemInstance.h"

#include "Inventory/LyraInventoryItemDefinition.h"
#include "Net/UnrealNetwork.h"

#if UE_WITH_IRIS
#include "Iris/ReplicationSystem/ReplicationFragmentUtil.h"
#endif // UE_WITH_IRIS

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraInventoryItemInstance)

class FLifetimeProperty;

/**
 * 构造函数
 * @param ObjectInitializer 对象初始化器
 */
ULyraInventoryItemInstance::ULyraInventoryItemInstance(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{
}

/**
 * 获取生命周期复制属性
 * @param OutLifetimeProps 输出生命周期属性数组
 */
void ULyraInventoryItemInstance::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps); // 调用父类方法

	DOREPLIFETIME(ThisClass, StatTags); // 复制属性标签
	DOREPLIFETIME(ThisClass, ItemDef); // 复制物品定义
}

#if UE_WITH_IRIS
/**
 * 注册复制片段
 * @param Context 片段注册上下文
 * @param RegistrationFlags 注册标志
 */
void ULyraInventoryItemInstance::RegisterReplicationFragments(UE::Net::FFragmentRegistrationContext& Context, UE::Net::EFragmentRegistrationFlags RegistrationFlags)
{
	using namespace UE::Net;

	// 为此对象创建并注册属性复制片段
	FReplicationFragmentUtil::CreateAndRegisterFragmentsForObject(this, Context, RegistrationFlags);
}
#endif // UE_WITH_IRIS

/**
 * 添加属性标签堆栈
 * @param Tag 游戏标签
 * @param StackCount 堆叠数量
 */
void ULyraInventoryItemInstance::AddStatTagStack(FGameplayTag Tag, int32 StackCount)
{
	StatTags.AddStack(Tag, StackCount); // 添加标签堆栈
}

/**
 * 移除属性标签堆栈
 * @param Tag 游戏标签
 * @param StackCount 堆叠数量
 */
void ULyraInventoryItemInstance::RemoveStatTagStack(FGameplayTag Tag, int32 StackCount)
{
	StatTags.RemoveStack(Tag, StackCount); // 移除标签堆栈
}

/**
 * 获取属性标签堆叠数量
 * @param Tag 游戏标签
 * @return 堆叠数量
 */
int32 ULyraInventoryItemInstance::GetStatTagStackCount(FGameplayTag Tag) const
{
	return StatTags.GetStackCount(Tag); // 返回堆叠数量
}

/**
 * 检查是否具有属性标签
 * @param Tag 游戏标签
 * @return 是否包含标签
 */
bool ULyraInventoryItemInstance::HasStatTag(FGameplayTag Tag) const
{
	return StatTags.ContainsTag(Tag); // 检查是否包含标签
}

/**
 * 设置物品定义类
 * @param InDef 物品定义类
 */
void ULyraInventoryItemInstance::SetItemDef(TSubclassOf<ULyraInventoryItemDefinition> InDef)
{
	ItemDef = InDef; // 设置物品定义
}

/**
 * 根据片段类查找片段
 * @param FragmentClass 片段类
 * @return 找到的片段
 */
const ULyraInventoryItemFragment* ULyraInventoryItemInstance::FindFragmentByClass(TSubclassOf<ULyraInventoryItemFragment> FragmentClass) const
{
	if ((ItemDef != nullptr) && (FragmentClass != nullptr))
	{
		return GetDefault<ULyraInventoryItemDefinition>(ItemDef)->FindFragmentByClass(FragmentClass); // 获取默认对象并查找片段
	}

	return nullptr; // 参数无效返回nullptr
}